import Vue from 'vue'

var deviceapi = {
    uRecordID: -1,

    W_OK: 0,//检查成功
    W_TRY: 1,//试用
    W_NO_FOUND: 2,//没有找到校验服务器
    W_EXCEED_NUM: 3,//超过用户数了

    // 本地电话机摘机事件
    BriEvent_PhoneHook: 1,
    // 本地电话机挂机事件
    BriEvent_PhoneHang: 2,

    // 外线通道来电响铃事件
    // BRI_EVENT.lResult		为响铃次数
    // BRI_EVENT.szData[0]:'0'	开始1秒响铃
    // BRI_EVENT.szData[0]:'1'	为1秒响铃完成，开始4秒静音
    BriEvent_CallIn: 3,

    // 得到来电号码
    // BRI_EVENT.lResult		来电号码模式(CALLIDMODE_FSK/CALLIDMODE_DTMF
    // BRI_EVENT.szData		保存的来电号码
    // 该事件可能在响铃前,也可能在响铃后
    BriEvent_GetCallID: 4,

    // 对方停止呼叫(产生一个未接电话)
    BriEvent_StopCallIn: 5,

    // 调用开始拨号后，全部号码拨号结束
    BriEvent_DialEnd: 6,

    // 播放文件结束事件
    // BRI_EVENT.lResult	   播放文件时返回的句柄ID 
    BriEvent_PlayFileEnd: 7,

    // 多文件连播结束事件
    // 
    BriEvent_PlayMultiFileEnd: 8,

    //播放字符结束
    BriEvent_PlayStringEnd: 9,

    // 播放文件结束准备重复播放
    // BRI_EVENT.lResult	   播放文件时返回的句柄ID 
    // 
    BriEvent_RepeatPlayFile: 10,

    // 给本地设备发送震铃信号时发送号码结束
    BriEvent_SendCallIDEnd: 11,

    //给本地设备发送震铃信号时超时
    //默认不会超时
    BriEvent_RingTimeOut: 12,

    //正在内线震铃
    // BRI_EVENT.lResult	   已经响铃的次数
    // BRI_EVENT.szData[0]:'0'	开始一次响铃
    // BRI_EVENT.szData[0]:'1'	一次响铃完成，准备静音
    BriEvent_Ringing: 13,

    // 通话时检测到一定时间的静音.默认为5秒
    BriEvent_Silence: 14,

    // 线路接通时收到DTMF码事件
    // 该事件不能区分通话中是本地话机按键还是对方话机按键触发
    BriEvent_GetDTMFChar: 15,

    // 拨号后,被叫方摘机事件（该事件仅做参考,原因如下：）
    // 原因：
    // 该事件只适用于拨打是标准信号音的号码时，也就是拨号后带有标准回铃音的号码。
    // 如：当拨打的对方号码是彩铃(彩铃手机号)或系统提示音(179xx)都不是标准回铃音时该事件无效。
    // 
    BriEvent_RemoteHook: 16,

    // 挂机事件
    // 如果线路检测到被叫方摘机后，被叫方挂机时会触发该事件，不然被叫方挂机后就触发BriEvent_Busy事件
    // 该事件或者BriEvent_Busy的触发都表示PSTN线路已经被断开
    BriEvent_RemoteHang: 17,

    // 检测到忙音事件,表示PSTN线路已经被断开
    BriEvent_Busy: 18,

    // 本地摘机后检测到拨号音
    BriEvent_DialTone: 19,

    // 只有在本地话机摘机，没有调用软摘机时，检测到DTMF拨号
    BriEvent_PhoneDial: 20,

    // 电话机拨号结束呼出事件。
    // 也就时电话机拨号后接收到标准回铃音或者15秒超时
    // BRI_EVENT.lResult:0 检测到回铃音// 注意：如果线路是彩铃是不会触发该类型
    // BRI_EVENT.lResult:1 拨号超时
    // BRI_EVENT.lResult:2 动态检测拨号码结束(根据中国大陆的号码规则进行智能分析，仅做参考)
    // BRI_EVENT.szData[0]:'1' 软摘机拨号结束后回铃了
    // BRI_EVENT.szData[0]:'0' 电话机拨号中回铃了
    BriEvent_RingBack: 21,

    // MIC插入状态
    // 只适用具有该功能的设备
    BriEvent_MicIn: 22,
    // MIC拔出状态
    // 只适用具有该功能的设备
    BriEvent_MicOut: 23,

    // 拍插簧(Flash)完成事件，拍插簧完成后可以检测拨号音后进行二次拨号
    // BRI_EVENT.lResult:TEL_FLASH  用户使用电话机进行拍叉簧完成
    // BRI_EVENT.lResult:SOFT_FLASH 调用StartFlash函数进行拍叉簧完成
    BriEvent_FlashEnd: 24,

    // 拒接完成
    BriEvent_RefuseEnd: 25,

    // 语音识别完成 
    BriEvent_SpeechResult: 26,

    //PSTN线路断开,线路进入空闲状态
    //当前没有软摘机而且话机也没摘机
    BriEvent_PSTNFree: 27,

    // 接收到对方准备发送传真的信号
    BriEvent_RemoteSendFax: 30,

    // 接收传真完成
    BriEvent_FaxRecvFinished: 31,
    // 接收传真失败
    BriEvent_FaxRecvFailed: 32,

    // 发送传真完成
    BriEvent_FaxSendFinished: 33,
    // 发送传真失败
    BriEvent_FaxSendFailed: 34,

    // 启动声卡失败
    BriEvent_OpenSoundFailed: 35,

    // 产生一个PSTN呼入/呼出日志
    BriEvent_CallLog: 36,

    //检测到连续的静音
    //使用QNV_GENERAL_CHECKSILENCE启动后检测到设定的静音长度
    BriEvent_RecvSilence: 37,

    //检测到连续的声音
    //使用QNV_GENERAL_CHECKVOICE启动后检测到设定的声音长度
    BriEvent_RecvVoice: 38,


    //远程上传事件
    BriEvent_UploadSuccess: 50,
    BriEvent_UploadFailed: 51,
    // 远程连接已被断开
    BriEvent_RemoteDisconnect: 52,

    //HTTP远程下载文件完成
    //BRI_EVENT.lResult	   启动下载时返回的本次操作的句柄
    BriEvent_DownloadSuccess: 60,
    BriEvent_DownloadFailed: 61,

    //线路检测结果
    //BRI_EVENT.lResult 为检测结果信息
    BriEvent_CheckLine: 70,


    // 应用层调用软摘机/软挂机成功事件
    // BRI_EVENT.lResult:0 软摘机
    // BRI_EVENT.lResult:1 软挂机			
    BriEvent_EnableHook: 100,
    // 喇叭被打开或者/关闭
    // BRI_EVENT.lResult:0 关闭
    // BRI_EVENT.lResult:1 打开			
    BriEvent_EnablePlay: 101,
    // MIC被打开或者关闭	
    // BRI_EVENT.lResult:0 关闭
    // BRI_EVENT.lResult:1 打开			
    BriEvent_EnableMic: 102,
    // 耳机被打开或者关闭
    // BRI_EVENT.lResult:0 关闭
    // BRI_EVENT.lResult:1 打开			
    BriEvent_EnableSpk: 103,
    // 电话机跟电话线(PSTN)断开/接通(DoPhone)
    // BRI_EVENT.lResult:0 断开
    // BRI_EVENT.lResult:1 接通		
    BriEvent_EnableRing: 104,
    // 修改录音源,(无用/保留)
    // BRI_EVENT.lResult 录音源数值
    BriEvent_DoRecSource: 105,
    // 开始软件拨号
    // BRI_EVENT.szData	准备拨的号码
    BriEvent_DoStartDial: 106,

    BriEvent_EnablePlayMux: 107,
    //接受DTMF按键
    BriEvent_RecvedDTMF: 194,
    //设备移除
    BriEvent_PlugOut: 195,
    // 接收到FSK信号，包括通话中FSK/来电号码的FSK		
    BriEvent_RecvedFSK: 198,
    //设备错误
    BriEvent_DevErr: 199,

    //设备信息
    QNV_DEVINFO_GETCHIPTYPE: 1,//获取USB模块类型
    QNV_DEVINFO_GETCHIPS: 2,//获取USB模块数量,该值等于最后一个通道的DEVID
    QNV_DEVINFO_GETTYPE: 3,//获取通道类型
    QNV_DEVINFO_GETMODULE: 4,//获取通道功能模块
    QNV_DEVINFO_GETCHIPCHID: 5,//获取通道所在USB芯片的中的传输ID(0或者1)
    QNV_DEVINFO_GETSERIAL: 6,//获取通道序列号(0-n)
    QNV_DEVINFO_GETCHANNELS: 7,//获取通道数量
    QNV_DEVINFO_GETDEVID: 8,//获取通道所在的USB模块ID(0-n)
    QNV_DEVINFO_GETDLLVER: 9,//获取DLL版本号
    QNV_DEVINFO_GETCHIPCHANNEL: 10,//获取该USB模块第一个传输ID所在的通道号
    QNV_DEVINFO_GETCHANNELTYPE: 11,//通道线路接外线还是话机类型
    QNV_DEVINFO_GETCHIPCHANNELS: 12,//获取该USB模块第二个传输ID所在的通道号

    QNV_DEVINFO_FILEVERSION: 20,//获取DLL的文件版本

    //函数general
    //uGeneralType
    QNV_GENERAL_STARTDIAL: 1,//开始拨号
    DIALTYPE_DTMF: 0x0,//DTMF拨号
    DIALTYPE_FSK: 0x1,//FSK拨号
    //文件录音格式
    BRI_WAV_FORMAT_DEFAULT: 0, // BRI_AUDIO_FORMAT_PCM8K16B
    BRI_WAV_FORMAT_ALAW8K: 1, // 8k/s
    BRI_WAV_FORMAT_ULAW8K: 2, // 8k/s
    BRI_WAV_FORMAT_IMAADPCM8K4B: 3, // 4k/s
    BRI_WAV_FORMAT_PCM8K8B: 4, // 8k/s
    BRI_WAV_FORMAT_PCM8K16B: 5, //16k/s
    BRI_WAV_FORMAT_MP38K8B: 6, //~1.2k/s //保留
    BRI_WAV_FORMAT_MP38K16B: 7, //~2.4k/s //保留
    BRI_WAV_FORMAT_TM8K1B: 8, //~1.5k/s
    BRI_WAV_FORMAT_GSM6108K: 9, //~2.2k/s
    BRI_WAV_FORMAT_END: 255, //无效ID

    RECORD_MASK_ECHO: 0x1,//回音抵消后的数据
    RECORD_MASK_AGC: 0x2,//自动增益后录音
    RECORD_MASK_PAUSE: 0x4,//暂停

    //录音控制
    //uRecordType
    QNV_RECORD_FILE_START: 1,//开始文件录音
    QNV_RECORD_FILE_PAUSE: 2,//暂停文件录音
    QNV_RECORD_FILE_RESUME: 3,//恢复文件录音
    QNV_RECORD_FILE_ISPAUSE: 4,//检测是否暂停文件录音
    QNV_RECORD_FILE_ELAPSE: 5,//获取已经录音的时间长度,单位(s)
    QNV_RECORD_FILE_SETVOLUME: 6,//设置文件录音音量
    QNV_RECORD_FILE_GETVOLUME: 7,//获取文件录音音量
    QNV_RECORD_FILE_PATH: 8,//获取文件录音的路径
    QNV_RECORD_FILE_STOP: 9,//停止某个文件录音
    QNV_RECORD_FILE_STOPALL: 10,//停止全部文件录音
    QNV_RECORD_FILE_COUNT: 11,//获取正在录音的数量
    QNV_RECORD_FILE_SETROOT: 20,//设置默认录音目录
    QNV_RECORD_FILE_GETROOT: 21,//获取默认录音目录

    //设备控制/状态
    //uCtrlType
    QNV_CTRL_DOSHARE: 1,//设备共享
    QNV_CTRL_DOHOOK: 2,//软件摘挂机控制
    QNV_CTRL_DOPHONE: 3,//控制电话机是否可用,可控制话机震铃,实现硬拍插簧等
    QNV_CTRL_DOPLAY: 4,//喇叭控制开关
    QNV_CTRL_DOLINETOSPK: 5,//线路声音到耳机，用耳机通话时打开
    QNV_CTRL_DOPLAYTOSPK: 6,//播放的语音到耳机
    QNV_CTRL_DOMICTOLINE: 7,//MIC说话声到电话线
    QNV_CTRL_ECHO: 8,//打开/关闭回音抵消
    QNV_CTRL_RECVFSK: 9,//打开/关闭接收FSK来电号码
    QNV_CTRL_RECVDTMF: 10,//打开/关闭接收DTMF
    QNV_CTRL_RECVSIGN: 11,//打开/关闭信号音检测
    QNV_CTRL_WATCHDOG: 12,//打开关闭看门狗
    QNV_CTRL_PLAYMUX: 13,//选择到喇叭的语音通道 line1x/pcplay ch0/line2x/pcplay ch1
    QNV_CTRL_PLAYTOLINE: 14,//播放的语音到line
    QNV_CTRL_SELECTLINEIN: 15,//选择输入的线路line通道
    QNV_CTRL_SELECTADCIN: 16,//选择输入的为线路还是MIC语音
    QNV_CTRL_PHONEPOWER: 17,//打开/关闭给话机供电使能,如果不给话机供电,dophone切换后,话机将不可用,所有对话机的操作都无效
    QNV_CTRL_RINGPOWER: 18,//内线震铃使能
    QNV_CTRL_LEDPOWER: 19,//LED指示灯
    QNV_CTRL_LINEOUT: 20,//线路输出使能
    QNV_CTRL_SWITCHOUT: 21,//硬件回音抵消
    QNV_CTRL_UPLOAD: 22,//打开/关闭设备USB数据上传功能,关闭后将接收不到设备语音数据
    QNV_CTRL_DOWNLOAD: 23,//打开/关闭设备USB数据下载功能,关闭后将不能发送语音/拨号到设备
    QNV_CTRL_POLARITY: 24,//开关级性反转摘机检测
    QNV_CTRL_ADBUSY: 25,//是否打开检测忙音叠加时环境(只有在使用两路外线网关时由于同时挂机才会触发忙音被叠加的环境,普通用户不需要使用)
    QNV_CTRL_RECVCALLIN: 26,//打开/关闭软解码来电
    QNV_CTRL_READFRAMENUM: 27,//一次请求读取的USB帧数量，越大占用CPU越小，延迟也就越大，一帧为4ms,最大30帧，也就是设置范围为(1-30)
    QNV_CTRL_DTMFCALLID: 28,//忽略DTMF模式接收来电号码,默认是开启检测的
    // -----------------一下是业务api---------------
    TV_Initialize(nextFunc) {
        //检测是否安装中间件
        //var qnv = document.getElementById('qnviccub');   
        //	qnv.attachEvent("OnQnvEvent", T_GetEvent);  
        let self = this;
        self.DevInfo(0, self.QNV_DEVINFO_GETCHANNELS, function (nResult) {
            if (nResult <= 0) {
                self.OpenDevice(0, function (nResult) {
                    self.DevInfo(0, self.QNV_DEVINFO_GETCHANNELS, function (channels) {
                        if (channels > 0) { //初始化变量
                            //SetParam(j,QNV_PARAM_DTMFVOL,5);
                            self.SetParam(0, self.QNV_PARAM_AM_LINEIN, 5, null); //把输入能量增益调为5
                            console.log("设备打开成功!");
                            nextFunc(1);
                        } else {
                            console.log("打开设备失败,请检查设备是否已经插入并安装了驱动,并且没有其它程序已经打开设备");
                            self.handleException();
                        }
                    });
                }); //OpenDevice
            } //if(nResult <= 0)
            else {
                nextFunc(0);
                console.log("设备已经被打开，不需要重复打开");
            }
        });
        return;
    },
    handleException() {
        let self = this;
        console.log("即将关闭设备");
        self.TV_EnableRing(0, 0);
        console.log("即将开启设备");
        setTimeout(() => {
            self.TV_EnableRing(0, 1);
            // AppendStatus("即将刷新页面");
            // window.parent.postMessage('message', true);
            // AppendStatus("reload success");
        }, 20)

    },
    // 拨号
    TV_StartDial(uID, szCode) { //正常拨号必须使用 DIALTYPE_DTMF
        console.log('uID, szCode', uID, szCode)
        console.log("general参数1", uID, this.QNV_GENERAL_STARTDIAL, this.DIALTYPE_DTMF, szCode)
        this.General(uID, this.QNV_GENERAL_STARTDIAL, this.DIALTYPE_DTMF, szCode, function (nRet) {
            console.log('nRet,szCode:', nRet, szCode)
            if (nRet <= 0) {
                console.log("拨号失败:" + szCode);
            } else {
                console.log("开始拨号:" + szCode);
            }
        });
    },
    // 开始录音
    TV_StartRecordFile(uID) {
        let vFilePath = "d:\\phoneRecord\\续期专员电话录音.wav"; //有些操作系统c盘保护，保存到c盘可能会失败，可以换到其它盘符
        console.log("录音文件路径为:" + vFilePath);
        let self = this;
        if (vFilePath.length > 0) {
            let vFormatID = self.BRI_WAV_FORMAT_PCM8K16B; //选择使用8K16bit采样
            let vmask = self.RECORD_MASK_ECHO | self.RECORD_MASK_AGC; //使用回音抵消后并且自动增益的
            self.RecordFile(uID, self.QNV_RECORD_FILE_START, vFormatID, vmask, vFilePath, function (hRec) {
                self.uRecordID = hRec;
                if (self.uRecordID <= 0) {
                    console.log(hRec + "录音失败:" + vFilePath);
                } else {
                    console.log("开始录音文件: id=" + self.uRecordID + "  " + vFilePath);
                }
            });
        } else {
            console.log("没有选择文件");
        }
    },
    // 停止录音
    TV_StopRecordFile(uID) {
        let self = this;
        if (self.uRecordID > 0) {
            //var vRecPath=GetRecFilePath(uID,uRecordID[uID]);
            self.RecordFile(uID, self.QNV_RECORD_FILE_PATH, self.uRecordID, 0, 0, function (vRecPath) {
                self.RecordFile(uID, self.QNV_RECORD_FILE_ELAPSE, self.uRecordID, 0, 0, function (vElapse) {
                    self.RecordFile(uID, self.QNV_RECORD_FILE_STOP, self.uRecordID, 0, 0, function (nRet) {
                        console.log("停止录音:" + vRecPath + "  录音时间:" + vElapse);
                        self.uRecordID = 0;
                    });
                });
            });
        }
    },
    //线路声音到耳机，用耳机通话时
    TV_EnableLine2Spk(uID, bEnable) {
        this.SetDevCtrl(uID, this.QNV_CTRL_DOLINETOSPK, bEnable, null);
    },
    // 打开麦克风
    TV_EnableMic(uID, bEnable) {
        this.TV_EnableMic2Line(uID, bEnable);
    },
    // 挂机
    TV_HangUpCtrl(uID) {
        this.TV_EnableHook(uID, 0);
    },
    TV_EnableHook(uID, bEnable) {
        this.TV_SetDevCtrl(uID, this.QNV_CTRL_DOHOOK, bEnable, function (nResult) {
            console.log(bEnable ? "软摘机" : "软挂机");
        });
    },
    TV_EnableMic2Line(uID, bEnable) {
        //SetDevCtrl(uID,QNV_CTRL_DOMICTOLINE,bEnable);
        this.TV_SetDevCtrl(uID, this.QNV_CTRL_DOMICTOLINE, bEnable);
    },
    TV_EnableDoPhone(uID, bEnable) {
        this.SetDevCtrl(uID, this.QNV_CTRL_DOPHONE, bEnable);
    },
    TV_EnableRing(uID, bEnable) {
        this.TV_EnableDoPhone(uID, bEnable);
    },
    //控制设备参数函数
    //nChannel通道号
    //paramName//参数名
    //nValue参数值
    TV_SetDevCtrl(nChannel, paramName, nValue, nextFunc) {
        return this.SetDevCtrl(nChannel, paramName, nValue, nextFunc);
    },
    // -----------------一下是硬件api---------------
    getEvent(parseEvent) {
        let self = this;
        $.ajax({
            type: "post",
            url: "http://127.0.0.1:3001/msg/",
            dataType: "jsonp",
            timeout: 30000,
            data: { "act": "get", "timeout": 30000 },
            //data中的timeout值要跟前面AJAX的timeout值相等，不设置默认是30000
            success: function (data, textStatus) {
                // console.log("message success:" + data + "..." + textStatus)
                // $("#StatusArea").append("--- " + data );
                if (textStatus == "success") {
                    self.getEvent(parseEvent);
                }
                if (data != null) {
                    //AppendStatus(data+ "--\r\n");
                    parseEvent(data.ch, data.e_type, data.e_handle, data.l_result, data.e_data);
                }
            },
            complete: function (XMLHttpRequest, textStatus) {
                if (XMLHttpRequest.readyState == "4") {
                    //console.log(XMLHttpRequest.responseText);  
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                //$("#StatusArea").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>");
                if (textStatus == "timeout") { // 请求超时
                    // 递归调用
                    self.getEvent(parseEvent);
                    // 其他错误，如网络错误等
                } else {
                    // self.getEvent(parseEvent);
                }
            }
        });
        // setTimeout(getEvent ,1000);
    },
    sendCmd(cmd_name, paraObj, resultCallback) {
        var nResult = -99;
        var bSync = false;
        $.ajax({
            type: "post",
            url: "http://127.0.0.1:3001/cmd/",
            dataType: "jsonp",
            data: { "act": cmd_name, "para": JSON.stringify(paraObj) },
            async: false,
            success: function (data, textStatus) {
                // $("#StatusArea").append("--- " + data );
                bSync = true;
                nResult = data.result;
                if (resultCallback != "" && resultCallback != null)
                    resultCallback(nResult);
                return nResult;
            },
            complete: function (XMLHttpRequest, textStatus) {
                if (XMLHttpRequest.readyState == "4") {
                    //console.log(XMLHttpRequest.responseText);  
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                console.log("网络错误! " + textStatus + ", error: " + errorThrown);
                if (textStatus == "timeout") { // 请求超时
                    //getEvent(); // 递归调用
                    // 其他错误，如网络错误等
                } else {
                    //getEvent();
                }
                bSync = true;
            }
        });
        //	Sleep(500);
        //	var timestamp=new Date().getTime();
        //	console.log(timestamp+"---"+ nResult);
        return nResult;
    },
    // 检查本地设备服务程序是否安装命令
    check_ver(iVer, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = iVer;
        $.ajax({
            type: "post",
            url: "http://127.0.0.1:3001/cmd/",
            dataType: "jsonp",
            data: { "act": "check_ver", "para": JSON.stringify(paraObj) },
            timeout: 1000,
            //async:false,
            success: function (data, textStatus) {
                // $("#StatusArea").append("--- " + data );
                nResult = data.result;
                if (nextFunc != "" && nextFunc != null)
                    nextFunc(nResult);
                return nResult;
            },
            complete: function (XMLHttpRequest, textStatus) {
                if (XMLHttpRequest.readyState == "4") {
                    //console.log(XMLHttpRequest.responseText);  
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                //console.log("没有安装! " + textStatus + ", error: " + errorThrown );
                nextFunc(nResult);
                if (textStatus == "timeout") { // 请求超时
                    //getEvent(); // 递归调用
                    // 其他错误，如网络错误等
                } else {
                    //getEvent();
                }
                return nResult;
            }
        });
        return nResult;
    },
    set_check_data_url(strUrl, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = strUrl;
        nResult = this.sendCmd("set_check_url", paraObj, nextFunc);
        return nResult;
    },
    DevInfo(nChannelID, uDevInfoType, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = nChannelID;
        paraObj.b = uDevInfoType;
        nResult = this.sendCmd("QNV_DevInfo", paraObj, nextFunc);
        return nResult;
    },
    //最右边的是执行下一个函数的参数
    //下一步函数格式为function nextFunc(nResult)内含上次函数执行后返回的结果
    OpenDevice(nDevice_type, nextFunc) {

        var nResult = -99;
        var paraObj = {};
        paraObj.a = nDevice_type;
        paraObj.b = 0;
        nResult = this.sendCmd("QNV_OpenDevice", paraObj, nextFunc);
        return nResult;
    },
    CloseDevice(nDevice_type, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = nDevice_type;
        paraObj.b = 0;
        nResult = this.sendCmd("QNV_CloseDevice", paraObj, nextFunc);
        return nResult;
    },
    SetDevCtrl(nChannelID, uCtrlType, nValue, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = nChannelID;
        paraObj.b = uCtrlType;
        paraObj.c = nValue;
        nResult = this.sendCmd("QNV_SetDevCtrl", paraObj, nextFunc);
        return nResult;
    },
    GetDevCtrl(nChannelID, uCtrlType, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = nChannelID;
        paraObj.b = uCtrlType;
        nResult = this.sendCmd("QNV_GetDevCtrl", paraObj, nextFunc);
        return nResult;
    },
    SetParam(nChannelID, uParamType, nValue, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = nChannelID;
        paraObj.b = uParamType;
        paraObj.c = nValue;
        nResult = this.sendCmd("QNV_SetParam", paraObj, nextFunc);
        return nResult;
    },
    General(nChannelID, uGeneralType, nValue, pValue, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = nChannelID;
        paraObj.b = uGeneralType;
        paraObj.c = nValue;
        paraObj.d = pValue;
        nResult = this.sendCmd("QNV_General", paraObj, nextFunc);
        return nResult;
    },
    RecordFile(nChannelID, uRecordType, nValue, nValueEx, pValue, nextFunc) {
        var nResult = -99;
        var paraObj = {};
        paraObj.a = nChannelID;
        paraObj.b = uRecordType;
        paraObj.c = nValue;
        paraObj.d = nValueEx;
        paraObj.e = pValue;
        nResult = this.sendCmd("QNV_RecordFile", paraObj, nextFunc);
        return nResult;
    },
}

export default deviceapi;